package br.ucb.ucblive.managedbean;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;

import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;

import br.ucb.ucblive.HIB.DisciplinaHIB;
import br.ucb.ucblive.HIB.EventoHIB;
import br.ucb.ucblive.HIB.PostagemHIB;
import br.ucb.ucblive.HIB.TopicoHIB;
import br.ucb.ucblive.HIB.UsuarioHIB;
import br.ucb.ucblive.beans.Disciplina;
import br.ucb.ucblive.beans.Evento;
import br.ucb.ucblive.beans.LinhaTempo;
import br.ucb.ucblive.beans.Postagem;
import br.ucb.ucblive.beans.Topico;
import br.ucb.ucblive.beans.Usuario;
import br.ucb.ucblive.comparador.LinhaTempoComparator;

@ManagedBean(name="loginManagedBean")
@SessionScoped
public class LoginManagedBean {

	private String login;
	private Usuario usuario;
	private UsuarioHIB usuarioHIB;
	private EventoHIB eventoHIB;
	private TopicoHIB topicoHIB;
	private PostagemHIB postagemHIB;
	private DisciplinaHIB disciplinaHIB;
	private List<Evento> eventos;
	private List<Topico> topicos;
	private List<Postagem> postagens;
	private List<Object> objetos;
	private List<LinhaTempo> linhaTempo;
	private Usuario usuarioLogin;
	private int cont=20;
	
	public LoginManagedBean(){  
		setUsuarioHIB(new UsuarioHIB());
		setEventoHIB(new EventoHIB());
		setTopicoHIB(new TopicoHIB());
		setPostagemHIB(new PostagemHIB());
		setDisciplinaHIB(new DisciplinaHIB());
		setLogin(FacesContext.getCurrentInstance().getExternalContext().getUserPrincipal().getName());
		setUsuarioLogin(usuarioHIB.consultar(FacesContext.getCurrentInstance().getExternalContext().getUserPrincipal().getName()));
		setUsuario(usuarioHIB.consultar(getLogin()));
		acionaLinhaDoTempo();
		verificaAcesso();
		getFoto();
	}
	
	public String getLogin() {
		return login;
	}
	public void setLogin(String login) {
		this.login = login;
	}
	public Usuario getUsuario() {
		return usuario;
	}
	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}
	
	public UsuarioHIB getUsuarioHIB() {
		return usuarioHIB;
	}
	public void setUsuarioHIB(UsuarioHIB usuarioHIB) {
		this.usuarioHIB = usuarioHIB;
	}

	public EventoHIB getEventoHIB() {
		return eventoHIB;
	}

	public void setEventoHIB(EventoHIB eventoHIB) {
		this.eventoHIB = eventoHIB;
	}

	public TopicoHIB getTopicoHIB() {
		return topicoHIB;
	}

	public void setTopicoHIB(TopicoHIB topicoHIB) {
		this.topicoHIB = topicoHIB;
	}

	public PostagemHIB getPostagemHIB() {
		return postagemHIB;
	}

	public void setPostagemHIB(PostagemHIB postagemHIB) {
		this.postagemHIB = postagemHIB;
	}

	public List<Evento> getEventos() {
		return eventos;
	}

	public void setEventos(List<Evento> eventos) {
		this.eventos = eventos;
	}

	public List<Topico> getTopicos() {
		return topicos;
	}

	public void setTopicos(List<Topico> topicos) {
		this.topicos = topicos;
	}

	public List<Postagem> getPostagens() {
		return postagens;
	}

	public void setPostagens(List<Postagem> postagens) {
		this.postagens = postagens;
	}

	public DisciplinaHIB getDisciplinaHIB() {
		return disciplinaHIB;
	}

	public void setDisciplinaHIB(DisciplinaHIB disciplinaHIB) {
		this.disciplinaHIB = disciplinaHIB;
	}
	
	public List<Object> getObjetos() {
		return objetos;
	}

	public void setObjetos(List<Object> objetos) {
		this.objetos = objetos;
	}

	public List<LinhaTempo> getLinhaTempo() {
		return linhaTempo;
	}

	public void setLinhaTempo(List<LinhaTempo> linhaTempo) {
		this.linhaTempo = linhaTempo;
	}
	
	public Usuario getUsuarioLogin() {
		return usuarioLogin;
	}

	public void setUsuarioLogin(Usuario usuarioLogin) {
		this.usuarioLogin = usuarioLogin;
	}
	
	public void verificaAcesso(){
		if(usuarioLogin.getDataAcesso()!=null){
			if((usuarioLogin.getDataAcesso().compareTo(new Date())==0) ||
					(usuarioLogin.getDataAcesso().compareTo(new Date())<0)){
				usuarioLogin.setStatus(0);
				usuarioLogin.setDataAcesso(null);
				usuarioHIB.salvar(usuarioLogin);
			}
		}
	}		
	
	public StreamedContent getFoto(){
		if(usuario.getFotoPerfil()!=null){
			InputStream stream = new ByteArrayInputStream(usuario.getFotoPerfil());
			StreamedContent imagem = new DefaultStreamedContent(stream);		
			return imagem;
		}
		return new DefaultStreamedContent();
	}
	
	public void countSeconds(){
		cont--;
		if(cont==0)
			cont=20;
	}
	
	public String index(){
		String url = "";
		if(usuario.getTipo()==1)
		 url = "/mod/index?faces-redirect=true";
		if(usuario.getTipo()==2)
			 url = "/pro/index?faces-redirect=true";
		if(usuario.getTipo()==3)
			 url = "/alu/index?faces-redirect=true";
		if(usuario.getTipo()==4)
			 url = "/adm/index?faces-redirect=true";
		return url;
	}

	public void acionaLinhaDoTempo(){		
		setLinhaTempo(new ArrayList<LinhaTempo>());
		setObjetos(new ArrayList<Object>());
		setEventos(new ArrayList<Evento>());
		setTopicos(new ArrayList<Topico>());
		setPostagens(new ArrayList<Postagem>());
		
		setEventos(eventoHIB.listarByUsuario(usuario));
		for (Disciplina disciplina : disciplinaHIB.listarDisciplinasByUsuario(usuario)){
			disciplina.setDisciplinaCurso(disciplinaHIB.listarCursoByDisciplina(disciplina.getIdDisciplina()));
			disciplina.setDisciplinaProfessor(disciplinaHIB.listarProfessorByDisciplina(disciplina.getIdDisciplina()));
			topicos.addAll(topicoHIB.listarTopicosByDisciplina(disciplina));
			for (Topico topico : topicos){
				topico.setDisciplina(disciplina);
				postagens.addAll(postagemHIB.listarPostagensByTopico(topico));
				for (Postagem postagem : postagens) {
					postagem.getTopico().setDisciplina(disciplina);
					postagem.getTopico().getDisciplina().setDisciplinaCurso(disciplinaHIB.listarCursoByDisciplina(disciplina.getIdDisciplina()));
					postagem.getTopico().getDisciplina().setDisciplinaProfessor(disciplinaHIB.listarProfessorByDisciplina(disciplina.getIdDisciplina()));
				}
			}
		}
		
		if(!eventos.isEmpty())
			objetos.addAll(eventos);
		if(!topicos.isEmpty())
			objetos.addAll(topicos);
		if(!postagens.isEmpty())
			objetos.addAll(postagens);
		
		Set<Object> objs = new HashSet<Object>();
		objs.addAll(objetos);
		objetos = new ArrayList<Object>();
		objetos.addAll(objs);
		
		for (Object objeto : objetos) {
			Evento evento = new Evento();
			Topico topico = new Topico();
			Postagem postagem = new Postagem();
			if(objeto instanceof Evento){
				evento = (Evento) objeto;
				if(evento.getDataCriacao().compareTo(evento.getDataAlteracao())==0)
					linhaTempo.add(new LinhaTempo("Evento criado por", evento, evento.getDataCriacao()));
				else{
					linhaTempo.add(new LinhaTempo("Evento criado por", evento, evento.getDataCriacao()));
					linhaTempo.add(new LinhaTempo("Evento alterado por", evento, evento.getDataAlteracao()));
				}
			}
			if(objeto instanceof Topico){
				topico = (Topico) objeto;
				if(topico.getDataCriacao().compareTo(topico.getDataAlteracao())==0)
					linhaTempo.add(new LinhaTempo("Topico criado por", topico, topico.getDataCriacao()));
				else{
					linhaTempo.add(new LinhaTempo("Topico criado por", topico, topico.getDataCriacao()));
					linhaTempo.add(new LinhaTempo("Topico alterado por", topico, topico.getDataAlteracao()));
				}
			}
			if(objeto instanceof Postagem){
				postagem = (Postagem) objeto;
				if(postagem.getDataCriacao().compareTo(postagem.getDataAlteracao())==0)
					linhaTempo.add(new LinhaTempo("Postagem criada por", postagem, postagem.getDataCriacao()));
				else{
					linhaTempo.add(new LinhaTempo("Postagem criada por", postagem, postagem.getDataCriacao()));
					linhaTempo.add(new LinhaTempo("Postagem alterada por", postagem, postagem.getDataAlteracao()));
				}
			}
		}
		
		Collections.sort(linhaTempo, new LinhaTempoComparator());
		
		// Trecho de c�digo printa toda a linha do Tempo na Console
		/*for (LinhaTempo linha : linhaTempo) {
			if(linha.getEvento() != null){
				System.out.println(linha.getMensagem()+" - "+
				linha.getEvento().getTitulo()+" - "+
				linha.getData()+"\n");
			}
			if(linha.getTopico() != null){
				System.out.println(linha.getMensagem()+" - "+
				linha.getTopico().getTitulo()+" - "+
				linha.getData()+"\n");
			}
			if(linha.getPostagem() != null){
				System.out.println(linha.getMensagem()+" - "+
				linha.getPostagem().getIdPostagem()+" - "+
				linha.getData()+"\n");
			}
		}*/
	}

	public int getCont() {
		return cont;
	}

	public void setCont(int cont) {
		this.cont = cont;
	}
}
